In [1]:
!wget --no-check-certificate \
    https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip \
    -O /tmp/cats_and_dogs_filtered.zip
--2020-07-11 14:11:59--  https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip
Resolving storage.googleapis.com (storage.googleapis.com)... 173.194.216.128, 172.217.204.128, 172.217.203.128, ...
Connecting to storage.googleapis.com (storage.googleapis.com)|173.194.216.128|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 68606236 (65M) [application/zip]
Saving to: ‘/tmp/cats_and_dogs_filtered.zip’

/tmp/cats_and_dogs_ 100%[===================>]  65.43M   109MB/s    in 0.6s    

2020-07-11 14:12:00 (109 MB/s) - ‘/tmp/cats_and_dogs_filtered.zip’ saved [68606236/68606236]

In [2]:
import os
import zipfile
local_zip='/tmp/cats_and_dogs_filtered.zip'
zip_ref=zipfile.ZipFile(local_zip,'r')
zip_ref.extractall('/tmp')
zip_ref.close()
In [3]:
os.listdir('/tmp/cats_and_dogs_filtered')
Out[3]:
['train', 'vectorize.py', 'validation']
In [4]:
os.listdir('/tmp/cats_and_dogs_filtered/train')
Out[4]:
['dogs', 'cats']
In [5]:
print(len(os.listdir('/tmp/cats_and_dogs_filtered/train/dogs')))
print(len(os.listdir('/tmp/cats_and_dogs_filtered/train/cats')))
1000
1000
In [6]:
base_dir='/tmp/cats_and_dogs_filtered'
train_dir=os.path.join(base_dir,'train')
validation_dir=os.path.join(base_dir,'validation')

train_dogs_dir=os.path.join(train_dir,'dogs')
train_cats_dir=os.path.join(train_dir,'cats')

val_dogs_dir=os.path.join(validation_dir,'dogs')
val_cats_dir=os.path.join(validation_dir,'cats')
In [7]:
train_cats_filenames=os.listdir(train_cats_dir)
train_cats_filenames[:4]
Out[7]:
['cat.955.jpg', 'cat.776.jpg', 'cat.914.jpg', 'cat.467.jpg']
In [8]:
import matplotlib.pyplot as plt
%matplotlib inline
In [9]:
plt.imshow(plt.imread(os.path.join(train_cats_dir,train_cats_filenames[0])))
Out[9]:
<matplotlib.image.AxesImage at 0x7fc888e43240>
In [10]:
import random
In [11]:
images=[]
plt.figure(figsize=(16,16))
for i in range(16):
  plt.subplot(4,4,i+1)
  imgname=random.choice(train_cats_filenames)
  images.append(imgname)
  img=plt.imread(os.path.join(train_cats_dir,imgname))
  plt.imshow(img)
  plt.title(img.shape)
In [12]:
plt.figure(figsize=(16,16))
j=1
for i in images:
  img=plt.imread(os.path.join(train_cats_dir,i))
  plt.subplot(4,4,j)
  plt.hist(img.flat)
  j+=1
In [13]:
train_dogs_filenames=os.listdir(train_dogs_dir)
train_dogs_filenames[:4]
Out[13]:
['dog.119.jpg', 'dog.723.jpg', 'dog.1.jpg', 'dog.638.jpg']
In [14]:
dogs_images=[]
plt.figure(figsize=(16,16))
for i in range(16):
  plt.subplot(4,4,i+1)
  imgname=random.choice(train_dogs_filenames)
  dogs_images.append(imgname)
  img=plt.imread(os.path.join(train_dogs_dir,imgname))
  plt.imshow(img)
  plt.title(img.shape)
In [15]:
plt.figure(figsize=(16,16))
j=1
for i in dogs_images:
  img=plt.imread(os.path.join(train_dogs_dir,i))
  plt.subplot(4,4,j)
  plt.hist(img.flat)
  j+=1
In [16]:
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
val_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(train_dir,target_size=(150, 150),batch_size=20,class_mode='binary')

validation_generator = val_datagen.flow_from_directory(validation_dir,target_size=(150, 150),batch_size=20,class_mode='binary')
Found 2000 images belonging to 2 classes.
Found 1000 images belonging to 2 classes.
In [18]:
img,labels=train_generator.next()
print(img.shape)
print(labels.shape)
(20, 150, 150, 3)
(20,)
In [24]:
plt.figure(figsize=(16,16))
for i in range(20):
  plt.subplot(4,5,i+1)
  plt.imshow(img[i,:,:,:])
  plt.title(labels[i])
  plt.axis("off")
In [23]:
 
In [25]:
## import required methods
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D,Dense,Flatten,MaxPooling2D
In [26]:
model = Sequential()
## add a conv layer followed by maxpooling
model.add(Conv2D(16,3,activation='relu',input_shape=(150,150,3)))
model.add(MaxPooling2D(2))
## add a conv layer followed by maxpooling
model.add(Conv2D(32,3,activation='relu',input_shape=(150,150,3)))
model.add(MaxPooling2D(2))
## add a conv layer followed by maxpooling
model.add(Conv2D(64,3,activation='relu',input_shape=(150,150,3)))
model.add(MaxPooling2D(2))
# Convert the featuremap into 1D  array
model.add(Flatten())
# Fully connected layer with 512 neurons
model.add(Dense(512,activation='relu'))
## Final output layer
model.add(Dense(1,activation='sigmoid'))

#let us see the summary
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 148, 148, 16)      448       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 74, 74, 16)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 72, 72, 32)        4640      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 36, 36, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 34, 34, 64)        18496     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 17, 17, 64)        0         
_________________________________________________________________
flatten (Flatten)            (None, 18496)             0         
_________________________________________________________________
dense (Dense)                (None, 512)               9470464   
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 513       
=================================================================
Total params: 9,494,561
Trainable params: 9,494,561
Non-trainable params: 0
_________________________________________________________________
In [27]:
### Compiling the model
import tensorflow as tf

model.compile(loss=tf.keras.losses.BinaryCrossentropy(),metrics=['accuracy'])
In [28]:
history=model.fit(train_generator,epochs=15,validation_data=validation_generator,batch_size=32)
Epoch 1/15
100/100 [==============================] - 56s 559ms/step - loss: 0.7842 - accuracy: 0.5615 - val_loss: 0.6724 - val_accuracy: 0.5790
Epoch 2/15
100/100 [==============================] - 56s 556ms/step - loss: 0.6285 - accuracy: 0.6565 - val_loss: 0.5787 - val_accuracy: 0.6960
Epoch 3/15
100/100 [==============================] - 56s 555ms/step - loss: 0.5520 - accuracy: 0.7275 - val_loss: 0.5734 - val_accuracy: 0.6950
Epoch 4/15
100/100 [==============================] - 55s 555ms/step - loss: 0.4704 - accuracy: 0.7730 - val_loss: 0.6387 - val_accuracy: 0.6970
Epoch 5/15
100/100 [==============================] - 55s 554ms/step - loss: 0.3912 - accuracy: 0.8130 - val_loss: 0.5828 - val_accuracy: 0.7210
Epoch 6/15
100/100 [==============================] - 56s 555ms/step - loss: 0.3209 - accuracy: 0.8690 - val_loss: 0.6283 - val_accuracy: 0.7230
Epoch 7/15
100/100 [==============================] - 56s 557ms/step - loss: 0.2116 - accuracy: 0.9085 - val_loss: 0.8353 - val_accuracy: 0.7160
Epoch 8/15
100/100 [==============================] - 55s 555ms/step - loss: 0.1511 - accuracy: 0.9470 - val_loss: 0.9043 - val_accuracy: 0.7340
Epoch 9/15
100/100 [==============================] - 55s 554ms/step - loss: 0.0996 - accuracy: 0.9630 - val_loss: 1.2711 - val_accuracy: 0.7140
Epoch 10/15
100/100 [==============================] - 56s 557ms/step - loss: 0.0853 - accuracy: 0.9710 - val_loss: 1.0232 - val_accuracy: 0.7110
Epoch 11/15
100/100 [==============================] - 56s 555ms/step - loss: 0.0494 - accuracy: 0.9835 - val_loss: 1.4052 - val_accuracy: 0.7300
Epoch 12/15
100/100 [==============================] - 55s 555ms/step - loss: 0.0537 - accuracy: 0.9855 - val_loss: 1.5516 - val_accuracy: 0.7390
Epoch 13/15
100/100 [==============================] - 56s 556ms/step - loss: 0.0734 - accuracy: 0.9840 - val_loss: 1.8815 - val_accuracy: 0.7230
Epoch 14/15
100/100 [==============================] - 56s 556ms/step - loss: 0.0581 - accuracy: 0.9890 - val_loss: 1.8129 - val_accuracy: 0.7110
Epoch 15/15
100/100 [==============================] - 55s 554ms/step - loss: 0.0328 - accuracy: 0.9910 - val_loss: 1.8683 - val_accuracy: 0.7150
In [31]:
train_acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
train_loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = list(range(1,16))
plt.figure(figsize=(16,4))
plt.subplot(1,2,1)
plt.plot(epochs,train_acc,label='train_acc')
plt.plot(epochs,val_acc,label='val_acc')
plt.title('accuracy')
plt.legend()
plt.subplot(1,2,2)
plt.plot(epochs,train_loss,label='train_loss')
plt.plot(epochs,val_loss,label='val_loss')
plt.title('loss')
plt.legend()
Out[31]:
<matplotlib.legend.Legend at 0x7fc842b11630>

With another model

In [34]:
model1 = Sequential()
## add a conv layer followed by maxpooling
model1.add(Conv2D(128,3,activation='relu',input_shape=(150,150,3)))
model1.add(MaxPooling2D(2))
## add a conv layer followed by maxpooling
model1.add(Conv2D(64,3,activation='relu',input_shape=(150,150,3)))
model1.add(MaxPooling2D(2))
## add a conv layer followed by maxpooling
model1.add(Conv2D(64,3,activation='relu',input_shape=(150,150,3)))
model1.add(MaxPooling2D(2))
## add a conv layer followed by maxpooling
model1.add(Conv2D(32,3,activation='relu',input_shape=(150,150,3)))
model1.add(MaxPooling2D(2))
# Convert the featuremap into 1D  array
model1.add(Flatten())
# Fully connected layer with 512 neurons
model1.add(Dense(512,activation='relu'))
## Final output layer
model1.add(Dense(1,activation='softmax'))

#let us see the summary
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 148, 148, 16)      448       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 74, 74, 16)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 72, 72, 32)        4640      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 36, 36, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 34, 34, 64)        18496     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 17, 17, 64)        0         
_________________________________________________________________
flatten (Flatten)            (None, 18496)             0         
_________________________________________________________________
dense (Dense)                (None, 512)               9470464   
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 513       
=================================================================
Total params: 9,494,561
Trainable params: 9,494,561
Non-trainable params: 0
_________________________________________________________________
In [36]:
model1.compile(loss=tf.keras.losses.BinaryCrossentropy(),metrics=['accuracy'])
In [38]:
history1=model.fit(train_generator,epochs=7,validation_data=validation_generator,batch_size=32)
Epoch 1/7
100/100 [==============================] - 56s 557ms/step - loss: 0.0174 - accuracy: 0.9935 - val_loss: 2.3424 - val_accuracy: 0.7340
Epoch 2/7
100/100 [==============================] - 56s 556ms/step - loss: 0.0315 - accuracy: 0.9940 - val_loss: 2.1382 - val_accuracy: 0.7120
Epoch 3/7
100/100 [==============================] - 56s 556ms/step - loss: 0.0404 - accuracy: 0.9895 - val_loss: 2.4633 - val_accuracy: 0.7170
Epoch 4/7
100/100 [==============================] - 56s 556ms/step - loss: 0.0524 - accuracy: 0.9920 - val_loss: 2.9110 - val_accuracy: 0.6960
Epoch 5/7
100/100 [==============================] - 56s 555ms/step - loss: 0.0206 - accuracy: 0.9940 - val_loss: 2.7923 - val_accuracy: 0.7060
Epoch 6/7
100/100 [==============================] - 56s 556ms/step - loss: 0.0186 - accuracy: 0.9945 - val_loss: 2.9310 - val_accuracy: 0.7320
Epoch 7/7
100/100 [==============================] - 56s 556ms/step - loss: 0.0320 - accuracy: 0.9955 - val_loss: 2.9885 - val_accuracy: 0.7340
In [41]:
train_acc = history1.history['accuracy']
val_acc = history1.history['val_accuracy']
train_loss = history1.history['loss']
val_loss = history1.history['val_loss']
epochs = list(range(1,8))
plt.figure(figsize=(16,4))
plt.subplot(1,2,1)
plt.plot(epochs,train_acc,label='train_acc')
plt.plot(epochs,val_acc,label='val_acc')
plt.title('accuracy')
plt.legend()
plt.subplot(1,2,2)
plt.plot(epochs,train_loss,label='train_loss')
plt.plot(epochs,val_loss,label='val_loss')
plt.title('loss')
plt.legend()
Out[41]:
<matplotlib.legend.Legend at 0x7fc838bd4fd0>

My 2nd model has overfitting issue
And 1st model at

In [ ]: